package com.liam.es.util.similarity;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import com.huaban.analysis.jieba.JiebaSegmenter;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 分词
 * @author liam
 */
public class Tokenizer {

    static JiebaSegmenter segmenter = new JiebaSegmenter();


    public static List<String> segmentStr(String sentence) {
        //1、 采用HanLP中文自然语言处理中标准分词进行分词
        List<Term> termList = HanLP.segment(sentence);

//        System.out.println(termList.toString());

        //2、重新封装到Word对象中（term.word代表分词后的词语，term.nature代表改词的词性）
        return termList.stream().map(term -> term.word).collect(Collectors.toList());
    }


    public static List<String> jiebaSegmentStr(String sentence) {

        List<String> termList = segmenter.sentenceProcess(sentence);

        //上面控制台打印信息就是这里输出的
//        System.out.println(termList.toString());

        //2、重新封装到Word对象中（term.word代表分词后的词语，term.nature代表改词的词性）
        return termList.stream().map(term -> term).collect(Collectors.toList());
    }





    public static List<Word> segment(String sentence) {
        //1、 采用HanLP中文自然语言处理中标准分词进行分词
        List<Term> termList = HanLP.segment(sentence);

        //上面控制台打印信息就是这里输出的
//        System.out.println(termList.toString());

        //2、重新封装到Word对象中（term.word代表分词后的词语，term.nature代表改词的词性）
        return termList.stream().map(term -> new Word(term.word, term.nature.toString())).collect(Collectors.toList());
    }


    public static List<Word> jiebaSegment(String sentence) {

        List<String> termList = segmenter.sentenceProcess(sentence);

        //上面控制台打印信息就是这里输出的
//        System.out.println(termList.toString());

        //2、重新封装到Word对象中（term.word代表分词后的词语，term.nature代表改词的词性）
        return termList.stream().map(term -> new Word(term)).collect(Collectors.toList());
    }


    /**
     * 分词效率测试
     *
     * @param args
     */
    public static void main(String[] args) {
        String s = "鸡蛋营养丰富，但是蛋黄中含有较高的胆固醇。因此成年人一般每天吃几个鸡蛋？";

        System.out.println(segment(s));
        System.out.println(jiebaSegment(s));

        long begin = System.currentTimeMillis();
        for(int i=0;i<50;i++){
            s = s + i;
            segment(s);
        }
        System.err.println(System.currentTimeMillis() - begin);

        s = "鸡蛋营养丰富，但是蛋黄中含有较高的胆固醇。因此成年人一般每天吃几个鸡蛋？";
        begin = System.currentTimeMillis();
        for(int i=0;i<1000;i++){
            s = s + i;
            jiebaSegment(s);
        }
        System.err.println(System.currentTimeMillis() - begin);
    }
}
